package com.copm.ifm.servers.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.copm.ifm.base.api.pojo.PageDTO;
import com.copm.ifm.base.api.pojo.PageVO;
import com.copm.ifm.base.basic.constant.DbConstants;
import com.copm.ifm.base.basic.exception.ServiceException;
import com.copm.ifm.base.basic.pojo.vo.SysStaffAllVO;
import com.copm.ifm.base.basic.util.AuthUtil;
import com.copm.ifm.base.basic.util.ValidatorUtil;
import com.copm.ifm.base.service.mp.page.PageProxy;
import com.copm.ifm.servers.sys.dto.SysStaffDTO;
import com.copm.ifm.servers.sys.entity.SysRole;
import com.copm.ifm.servers.sys.entity.SysStaff;
import com.copm.ifm.servers.sys.entity.SysStaffRole;
import com.copm.ifm.servers.sys.mapper.SysRoleMapper;
import com.copm.ifm.servers.sys.mapper.SysStaffMapper;
import com.copm.ifm.servers.sys.mapper.SysStaffRoleMapper;
import com.copm.ifm.servers.sys.service.SysStaffService;
import com.copm.ifm.servers.sys.vo.SysStaffVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 租户员工表 服务实现类
 *
 * @author zzf
 * @since 2020-12-22
 */
@Service
public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> implements SysStaffService {

    @Resource
    SysStaffMapper sysStaffMapper;

    @Resource
    SysRoleMapper sysRoleMapper;

    @Resource
    SysStaffRoleMapper sysStaffRoleMapper;

    @Override
    public SysStaffAllVO getAllInfoById(Integer id) {
        return baseMapper.selectAllInfoById(id);
    }

    @Override
    public PageVO<SysStaffVO> selectForPage(PageDTO<SysStaffDTO> pageDTO) {
        return PageProxy.proxy(baseMapper::selectForPage, pageDTO);
    }

    @Override
    public SysStaffVO selectVoById(int id) {
        return sysStaffMapper.selectVoById(id);
    }

    @Override
    public SysStaff selectById(int id) {
        return sysStaffMapper.selectById(id);
    }

    @Override
    public SysStaff selectCurrentUserInfo() {
        return sysStaffMapper.selectById(AuthUtil.getCurrentUserId());
    }

    @Override
    public int updateDeleted(int id) {
        SysStaff sysStaff = new SysStaff();
        sysStaff.setId(id);
        sysStaff.setDeleted(DbConstants.DEFAULT_YES);
        return sysStaffMapper.updateById(sysStaff);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveStaff(SysStaffDTO entity) {
        if (!StringUtils.isEmpty(entity.getPhone())) {
            if (!ValidatorUtil.isMobile(entity.getPhone())) {
                throw new ServiceException("请输入正确的手机号码，请修改后提交");
            }
        }
        if (!ValidatorUtil.isUserName(entity.getUsername())) {
            throw new ServiceException("请输入正确的账号(英文数字或者下划线)，请修改后提交");
        }

        Integer userId = AuthUtil.getCurrentUserId();
        if (StringUtils.isEmpty(entity.getUsername())) {
            throw new ServiceException("新增系统账号不能为空，请修改后提交");
        }
        List<SysStaff> staffList = baseMapper.selectList(new LambdaQueryWrapper<SysStaff>()
                .eq(SysStaff::getUsername, entity.getUsername())
                .eq(SysStaff::getTenantId, entity.getTenantId())
                .eq(SysStaff::getDeleted, DbConstants.DEFAULT_NO)
        );
        if (staffList.size() > 0) {
            throw new ServiceException("新增系统账号【" + entity.getUsername() + "】已存在，请修改后提交");
        }
        if (!StringUtils.isEmpty(entity.getTenantId())) {
            List<SysStaff> sysStaffsList = baseMapper.selectList(new LambdaQueryWrapper<SysStaff>()
                    .eq(SysStaff::getTenantId, entity.getTenantId())
                    .eq(SysStaff::getType, DbConstants.SUPPER_ADMIN)
            );
            if (sysStaffsList.size() > 0) {
                throw new ServiceException("只能存在一个超级管理员账号，请修改后提交");
            }
        }
        SysStaff sysStaff = new SysStaff();
        BeanUtils.copyProperties(entity, sysStaff);
        sysStaff.setCreateBy(userId);
        sysStaff.setUpdateBy(userId);
        sysStaff.setTenantId(StringUtils.isEmpty(entity.getTenantId()) ? AuthUtil.getCurrentUserTenant() : entity.getTenantId());
        sysStaff.setCreateTime(new Date());
        sysStaffMapper.insert(sysStaff);

        Integer sysStaffId = sysStaff.getId();
        if (!StringUtils.isEmpty(entity.getRoleName())) {
            String[] split = entity.getRoleName().split(",");
            if (split.length < 1) {
                throw new ServiceException("新增系统角色不能为空，请修改后提交");
            }
            List<SysStaffRole> staffRoleList = new ArrayList<>();
            Arrays.stream(split).forEach(
                    s -> {
                        SysStaffRole sysStaffRole = new SysStaffRole();
                        sysStaffRole.setStaffId(sysStaffId);
                        List<SysRole> sysStaffs = sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>()
                                .eq(SysRole::getName, s)
                                .select(SysRole::getId)
                        );
                        if (sysStaffs.size() < 1) {
                            throw new ServiceException("系统中没有相对应的角色名称，请先添加此角色权限");
                        }
                        sysStaffRole.setRoleId(sysStaffs.get(0).getId());
                        staffRoleList.add(sysStaffRole);
                    }
            );
            sysStaffRoleMapper.insertStaffRollList(staffRoleList);
            System.out.println(staffRoleList);
        }
    }

    @Override
    public int updateStaff(SysStaffDTO entity) {
        if (!ValidatorUtil.isMobile(entity.getPhone())) {
            throw new ServiceException("请输入正确的手机号码，请修改后提交");
        }
        if (!ValidatorUtil.isUserName(entity.getUsername())) {
            throw new ServiceException("请输入正确的账号(英文数字或者下划线)，请修改后提交");
        }
        String username = entity.getUsername();
        List<SysStaff> sysStaffs = new ArrayList<>();
        SysStaff sysStaff = new SysStaff();
        if (entity.getId() != null) {
            sysStaff = sysStaffMapper.selectOne(new LambdaQueryWrapper<SysStaff>()
                    .eq(SysStaff::getId, entity.getId())
                    .select());
        }
        if (entity.getUsername() != null) {
            sysStaffs = sysStaffMapper.selectList(new LambdaQueryWrapper<SysStaff>()
                    .eq(SysStaff::getUsername, username)
                    .select());
        }
        //有一个值且username与库中的值不相等
        if (!username.equals(sysStaff.getUsername()) && sysStaffs.size() > 0) {
            throw new ServiceException("添加的账号名" + username + "已存在，请修改后再次提交");
        }
        SysStaffRole sysStaffRole = new SysStaffRole();
        sysStaffRole.setId(entity.getStaffRoleId());
        sysStaffRole.setStaffId(entity.getId());
        Integer roleId = sysRoleMapper.selectSysByTenantId(0).stream()
                .filter(s -> entity.getRoleName().equals(s.getName()))
                .collect(Collectors.toList()).get(0).getId();
        sysStaffRole.setRoleId(roleId);
        sysStaffRoleMapper.updateById(sysStaffRole);
        SysStaff staff = new SysStaff();
        BeanUtils.copyProperties(entity, staff);
        staff.setUpdateBy(AuthUtil.getCurrentUserId());
        staff.setUpdateTime(new Date());
        return sysStaffMapper.updateById(staff);
    }

    @Override
    public int updateByName(SysStaff entity) {
        entity.setUpdateBy(AuthUtil.getCurrentUserId());
        entity.setUpdateTime(new Date());
        return sysStaffMapper.updateByName(entity);
    }
}
